<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Usuario_Model extends CI_Model {

	public function __construct()
	{
		parent::__construct();
		
		include_once 'app/enum/EnumTipoPerfil.php';
	}
	
	public function inserir($data){
	
		$retorno = $this->db->insert('tb_usuario', $data);
	
		if(!$retorno){
			throw new Exception('Ocorreu um erro ao inserir o Usuário. Favor tentar novamente mais tarde.');
		}else{
			if($this->db->affected_rows() > 0){
				return $this->db->insert_id();
			}
		}
	}
	
	public function alterar($data, $id){
		
		$this->db->where('idUsuario', $id);
		$retorno = $this->db->update('tb_usuario', $data);
		
		if(!$retorno){
			throw new Exception('Ocorreu um erro ao alterar o Usuário. Favor tentar novamente mais tarde.');
		}else{
			return true;
		}
	}
	
	public function inativarUsuarioPorIdPerfil($data, $idPerfil){
	
		$sql = "update tb_usuario
				set idUsuarioUltimaAlteracao = ".$data['idUsuarioUltimaAlteracao'].",
					dtUltimaAlteracao = '".$data['dtUltimaAlteracao']."',
					dtVigenciaFim = '".$data['dtVigenciaFim']."'
				where dtVigenciaFim is null
					  and idPerfil = " .$idPerfil;
	
		$retorno = $this->db->query($sql);
	
		if(!$retorno){
			throw new Exception('Ocorreu um erro ao alterar o Usuário. Favor tentar novamente mais tarde.');
		}else{
			return true;
		}
	}
	
	public function excluir($id){
	
		$this->db->where('idUsuario', $id);
		$retorno = $this->db->delete('tb_usuario');
	
		if(!$retorno){
			throw new Exception('Ocorreu um erro ao excluir o Usuário. Favor tentar novamente mais tarde.');
		}else{
			return true;
		}
	}
	
	public function inativar($id){
		
		$data['situacao'] = "I";
	
		$this->db->where('idUsuario', $id);
		$retorno = $this->db->update('tb_usuario', $data);
	
		if(!$retorno){
			throw new Exception('Ocorreu um erro ao alterar o Usuário. Favor tentar novamente mais tarde.');
		}else{
			return true;
		}
	}
	
	
	function obter($id){
	
		$sql = "select * 
				from tb_usuario as usu
					inner join tb_perfil as per on (per.idPerfil = usu.idPerfil)
					left join tb_pessoa as pe on (pe.idUsuario = usu.idUsuario)
				where usu.idUsuario = ".$id;
	
		$query = $this->db->query($sql);
	
		if($query->num_rows() > 0){
			$obj = $query->result();
			
			return $obj[0];
		}else{
			return null;
		}
	}
	
	function pesquisar($nome, $login, $cpf, $idPerfil, $situacao, $tipoPerfilLogin){
	
		$sql = "SELECT *
				FROM tb_usuario as usu
					inner join tb_pessoa as pe on (pe.idUsuario = usu.idUsuario)
					inner join tb_perfil as per on (per.idPerfil = usu.idPerfil)
				WHERE 1 = 1 ";
		
		if (!empty($tipoPerfilLogin)){
			if ((int)$tipoPerfilLogin === (int)EnumTipoPerfil::getCodigo(EnumTipoPerfil::ADMINISTRADOR_FULL)){
				if (!empty($tipoPerfil)){
					$sql .= "and per.tipoPerfil = ".$tipoPerfil." ";
				}
			}else{
				if (!empty($tipoPerfil)){
					$sql .= "and per.tipoPerfil = ".$tipoPerfil." and per.tipoPerfil <> ".(int)EnumTipoPerfil::getCodigo(EnumTipoPerfil::ADMINISTRADOR_FULL)." ";
				}else{
					$sql .= "and per.tipoPerfil <> ".(int)EnumTipoPerfil::getCodigo(EnumTipoPerfil::ADMINISTRADOR_FULL)." ";
				}
			}
		}else{
			if (!empty($tipoPerfil)){
				$sql .= "and per.tipoPerfil = ".$tipoPerfil." ";
			}
		}
	
		if (!empty($nome)){
			$sql .= "and pe.nome like '%".$nome."%' ";
		}
		
		if (!empty($login)){
			$sql .= "and usu.login like '%".$login."%' ";
		}
		
		if (!empty($cpf)){
			$sql .= "and pe.cpf = '".$cpf."' ";
		}
	
		if (!empty($idPerfil)){
			$sql .= "and usu.idPerfil = ".$idPerfil." ";
		}
	
		if (!empty($situacao)){
			if ($situacao === "A"){
				$sql .= "and usu.dtVigenciaFim is null
						 and pe.dtVigenciaFim is null ";
			}else{
				$sql .= "and usu.dtVigenciaFim is not null
						 and pe.dtVigenciaFim is not null ";
			}
		}
	
		$sql .= "order by pe.nome";
		
		$query = $this->db->query($sql);
	
		return $query->result();
	}
	
	
	public function validaEmailCadastrado($email){
	
		$sql = "select *
				from tb_usuario as usu
					inner join tb_senha as se on (se.idUsuario = usu.idUsuario) 
				where usu.email = '" . trim($email) . "'
					  and usu.dtVigenciaFim is null
					  and se.dtVigenciaFim is null";
	
		$query = $this->db->query($sql);
	
		return $query->result();
	}
	
	public function validaUsarioLogin($login, $senha){
	
		$sql = "select usu.idUsuario,
					   usu.login,
				 	   usu.idPerfil,
					   pe.tipoPerfil,
					   pes.nome,
					   pes.foto,
					   pes.idPessoa,
					   se.tipoSenha,
					   usu.dtUltimoAcesso
				from tb_usuario as usu
					inner join tb_senha as se on (se.idUsuario = usu.idUsuario)
					inner join tb_perfil as pe on (pe.idPerfil = usu.idPerfil)
					left join tb_pessoa as pes on (pes.idUsuario = usu.idUsuario and pes.dtVigenciaFim is null)
				where se.dtVigenciaFim is null
					and usu.dtVigenciaFim is null
					and pe.dtVigenciaFim is null
					and usu.login = '" . trim($login) . "'
					and se.senha = '" . trim($senha) . "'";
		
		$query = $this->db->query($sql);
	
		if($query->num_rows() > 0){
	
			$obj = $query->result();
				
			if (empty($obj[0]->foto)){
				$image = base_url().'www/images/admin/foto.jpg';
			}else{
				$image = base_url().trim($obj[0]->foto);
			}
			
			$dtUltimoLogin = empty($obj[0]->dtUltimoAcesso) ? date("Y-m-d H:i:s") : trim($obj[0]->dtUltimoAcesso);
			
			$data = array(
					'idUsuario'      => encrypt(trim($obj[0]->idUsuario)),
					'idPessoa'       => encrypt(trim($obj[0]->idPessoa)),
					'login'          => encrypt(trim($obj[0]->login)),
					'nome'		     => encrypt(trim($obj[0]->nome)),
					'idPerfil'       => encrypt(trim($obj[0]->idPerfil)),
					'tipoPerfil'     => encrypt(trim($obj[0]->tipoPerfil)),
					'foto'           => encrypt(trim($image)),
					'dtUltimoAcesso' => encrypt($dtUltimoLogin),
					'logged'         => true
			);
			$this->session->set_userdata($data);
	
			return $obj[0];
		}
	}
	
	function obterUsuarioPorLogin($login, $idUsuario){
		$sql = "select *
				from tb_usuario
				where login = '".$login."' ";
		
		if (!empty($idUsuario)){
			$sql .= "and idUsuario <> ".$idUsuario;
		}
	
		$query = $this->db->query($sql);
	
		if($query->num_rows() > 0){
			$obj = $query->result();
	
			return $obj[0];
		}else{
			return null;
		}
	}
	
	function obterUsuarioPorEmail($email, $idUsuario){
		$sql = "select *
				from tb_usuario
				where email = '".$email."' ";
	
		if (!empty($idUsuario)){
			$sql .= "and idUsuario <> ".$idUsuario;
		}
	
		$query = $this->db->query($sql);
	
		if($query->num_rows() > 0){
			$obj = $query->result();
	
			return $obj[0];
		}else{
			return null;
		}
	}
}